package com.accelstack.cmp.service;

import com.accelstack.cmp.entity.ContainerImageTemplateMap;
import com.accelstack.cmp.repository.ContainerImageTemplateMapRepository;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.Optional;

/**
 * 容器镜像模板映射服务
 */
@Service
@RequiredArgsConstructor
@Slf4j
@Transactional(readOnly = true)
public class ContainerImageTemplateMapService {

    private final ContainerImageTemplateMapRepository containerImageTemplateMapRepository;

    /**
     * 创建容器镜像模板映射
     * @param containerImageTemplateMap 待创建的容器镜像模板映射实体
     * @return 创建后的容器镜像模板映射实体
     */
    @Transactional
    public ContainerImageTemplateMap create(ContainerImageTemplateMap containerImageTemplateMap) {
        log.info("创建容器镜像模板映射: 容器ID={}, 模板版本ID={}", 
            containerImageTemplateMap.getContainer().getId(), 
            containerImageTemplateMap.getTemplateVersion().getId());
        return containerImageTemplateMapRepository.save(containerImageTemplateMap);
    }

    /**
     * 更新容器镜像模板映射
     * @param id 容器镜像模板映射ID
     * @param updatedMap 包含更新信息的容器镜像模板映射实体
     * @return 更新后的容器镜像模板映射实体，如果不存在则返回Optional.empty()
     */
    @Transactional
    public Optional<ContainerImageTemplateMap> update(Long id, ContainerImageTemplateMap updatedMap) {
        log.info("更新容器镜像模板映射: ID={}", id);
        return containerImageTemplateMapRepository.findById(id)
                .map(map -> {
                    map.setContainer(updatedMap.getContainer());
                    map.setTemplateVersion(updatedMap.getTemplateVersion());
                    map.setBindTime(updatedMap.getBindTime());
                    return containerImageTemplateMapRepository.save(map);
                });
    }

    /**
     * 根据ID删除容器镜像模板映射
     * @param id 容器镜像模板映射ID
     */
    @Transactional
    public void deleteById(Long id) {
        log.info("删除容器镜像模板映射: ID={}", id);
        containerImageTemplateMapRepository.deleteById(id);
    }

    /**
     * 根据ID查询容器镜像模板映射
     * @param id 容器镜像模板映射ID
     * @return 匹配的容器镜像模板映射实体
     */
    public Optional<ContainerImageTemplateMap> findById(Long id) {
        log.debug("查询容器镜像模板映射: ID={}", id);
        return containerImageTemplateMapRepository.findById(id);
    }

    /**
     * 查询所有容器镜像模板映射（支持分页）
     * @param pageable 分页信息
     * @return 容器镜像模板映射分页列表
     */
    public Page<ContainerImageTemplateMap> findAll(Pageable pageable) {
        log.debug("查询所有容器镜像模板映射 - 页码: {}, 大小: {}", pageable.getPageNumber(), pageable.getPageSize());
        return containerImageTemplateMapRepository.findAll(pageable);
    }

    /**
     * 查询所有容器镜像模板映射
     * @return 所有容器镜像模板映射列表
     */
    public List<ContainerImageTemplateMap> findAll() {
        log.debug("查询所有容器镜像模板映射");
        return containerImageTemplateMapRepository.findAll();
    }
}

